package cn.edu.swu.miniwebsvr.core;

import cn.edu.swu.miniwebsvr.handler.DefaultHandler;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class Router {
    public void route(Parameter request, OutputStream response) {
        Config config = Config.getInstance();

        // TODO: [222024321072055/苏雨征] 根据请求的URL获取Handler
        Handler handler = config.getHandler(request.getUrl());

        if (handler == null) {
            // 如果没有匹配的路由，使用 DefaultHandler 处理
            handler = config.getHandler("/");
            System.out.println("未匹配到URL："+request.getUrl()+",使用默认处理器");
        }
        // 2. 调用Handler处理请求（若Handler仍为空，返回500错误）
        if (handler != null) {
            try{
            handler.handle(request, response);
        }catch (Exception e) {
            // 捕获Handler处理过程中的异常，返回500错误
            System.err.println("Handler处理请求异常: " + e.getMessage());
            send500Error(response, "Handler处理请求失败: " + e.getMessage());
        }
    } else {
            // TODO: [222024321072055/苏雨征] 如果连DefaultHandler都没有，返回500 Internal Server Error
        System.err.println("严重错误：DefaultHandler未配置，无法处理请求");
        send500Error(response,"服务器内部错误：默认处理器未配置");
            }
        }
    private void send500Error(OutputStream response, String errorMsg) {
        try {
            // 构建符合HTTP协议的500响应（状态行 + 响应头 + 空行 + 响应体）
            String responseContent = "HTTP/1.1 500 Internal Server Error\r\n" +
                    "Content-Type: text/html; charset=UTF-8\r\n" +
                    "Content-Length: " + errorMsg.getBytes(StandardCharsets.UTF_8).length + "\r\n" +
                    "\r\n" + // 空行分隔响应头和响应体
                    "<!DOCTYPE html>\r\n" +
                    "<html>\r\n" +
                    "<head><title>500 错误</title></head>\r\n" +
                    "<body>\r\n" +
                    "<h1 style='color: red;'>500 Internal Server Error</h1>\r\n" +
                    "<p>" + errorMsg + "</p>\r\n" +
                    "</body>\r\n" +
                    "</html>";

            // 写入响应并刷新（确保数据立即发送）
            response.write(responseContent.getBytes(StandardCharsets.UTF_8));
            response.flush();
        } catch (Exception e) {
            System.err.println("发送500错误响应失败: " + e.getMessage());
        }
    }
}
